/*
 *      idmp.h
 *      
 *      Copyright 2009 Daniele Ricci <denn86@gmail.com>, Luca Saccagi <luksak86@gmail.com>
 *      
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *      
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *      
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

/** \file idmp.h
 * In questo file sono contenute tutte le strutture dati utilizzate da idmp per l'indicizzazione, per la ricerca e per
 * il processing delle query, nonchè el dichiarazione delle variabili globali e i \a define.
 */


#include <stdio.h>
#include <stdlib.h>
#ifndef _WIN32
#include <unistd.h>
#endif
#include <math.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xpathInternals.h>


#include <vortex.h>
#ifndef _WIN32
#include <stdbool.h>
#include <sys/types.h>
#include <sys/dir.h>
#else
#include <winf.h>
#include <time.h>
#include <assert.h>
#include <dirent.h>
#endif



#include "visual.h"

#include "filter.h"
#include "datastruct.h"
#include "comm.h"
#include "misc.h"
#include "queryperf.h"
#include "filter/IP.h"
#include "filter/IP_datastruct.h"
#include "filter/Time.h"
#include "filter/Time_datastruct.h"
#include "filter/Assessment.h"
#include "filter/Classification.h"
#include "filter/OtherAlert.h"
#include "filter/Xpath_datastruct.h"
#include "filter/Xpath.h"
#include "set.h"
/* ADDED */ #include "configuration.h"
/* ADDED */ #include "debug.h"

#ifndef _IDMP
#define _IDMP

#define _VERSION "dilca - Idmef Parser (v0.0.9)"
#define _VERSION1 "0.0.9"
/*V11*///#define _VORTEX11







#define NEXT next
#define CHILDREN children
#define CONTENT children->content
#define PROPERTIES properties->CONTENT

#define PLAIN_PROFILE "http://fact.aspl.es/profiles/plain_profile"///<Profilo beep senza alcun tipo di protezione, cifratura o controllo di identità
#define TLS_PROFILE "http://iana.org/beep/TLS"///<Profilo beep sul quale viene implementato il TLS

#define MAX_ALERT_NUM 150000///<Numero massimo di alert gestibili
#define REDUCT_RATE 1///<Tasso di riduzione

/*ADDED*/ #ifdef _WIN32
/*ADDED*/ #define DEFAULT_CONF_FILE "C:\\idmp.conf\0"
/*ADDED*/ #define MOVECMD "move "
/*ADDED*/ #define STOREDIR "C:\\Documents and Settings\\Administrator\\Desktop\\DILCA\\dataset\\idmp-store\\\0"
/*ADDED*/ #define DYNDIR "C:\\Documents and Settings\\Administrator\\Desktop\\DILCA\\dataset\\idmef-archive\\\0"
/*ADDED*/ #else
/*ADDED*/ #define DEFAULT_CONF_FILE "/etc/idmp.conf\0"
/*ADDED*/ #define MOVECMD "mv "
#define STOREDIR "../../dataset/idmp-store/\0"
#define DYNDIR "../../dataset/idmef-archive/\0"
/*ADDED*/ #endif

#define NEW_SON 1
#define NEW_BRO 2

/*ADDED*/int exists_sended;
/*ADDED*/ int DELMSGcnt; 
int MSGcnt; //into setMessage() to display the number of idmef loaded messages;
unsigned int msg_no;
/*ADDED*/int sending; //into visualMessage() to count the number of ANS sending to the client
char *dynamicArchive,*storedir;///<Path delle directory contenenti gli alert
VortexMutex mutex;
/*ADDED*/VortexMutex cnt_lock;
/*ADDED*/xmlDocPtr doc;
/*ADDED*/ conf *c0; //Struttura che deve contenere i parametri di configurazione;
/*ADDED*/ #ifdef _WIN32
/*ADDED*/ static unsigned char pow2[]={1,2,4,8,16,32,64,128};
/*ADDED*/ #else
char pow2[]={1,2,4,8,16,32,64,128};
/*ADDED*/ #endif

/*V11*/#ifdef _VORTEX11
/*V11*/VortexCtx *ctx;
/*V11*/	#endif

/**\struct processingTree idmp.h
 * \brief Elemento dell'albero di esecuzione
 * 
 * Questa struttura rappresenta un'operazione da eseguire, che può essere di filtraggio o logica.
 * La struttura ad albero permette di effettuare il parsing sulla sintassi delle query e passare poi all'esecuzione delle stesse
 * iniziando prima con i filtri di livello inferiore, per poi aggregare i dati restituiti da essi tramite le funzioni logiche.
 */
typedef struct processingTree {
	char *OP;///<Stringa di identificazione dell'operazione da eseguire
	int sign_num;
	int step_num;
	/*QUERYNEG*/unsigned char sign_mode;
	struct processingTree *father;///<L'operazione al livello immediatamente superiore nell'albero di esecuzione, se presente può essere solamente una dell oprazioni logiche (OR, AND)
	struct processingTree *sons;///<Lista delle operazioni al livello immediatamente inferiore nellalbero di esecuzione, presenti solo se l'ìoperazione attuale è un'operazione logica
	struct processingTree *prevbro;///<L'operazione precedente, allo stesso livello d profondità nell'albero di esecuzione
	struct processingTree *nextbro;///<L'operazione successiva, allo stesso livello d profondità nell'albero di esecuzione
	} processingTree;

typedef struct stringList {
	char *str;
	struct stringList *next;
	} stringList;

int parenthesis;///<Numero di parentesi aperte nella query, utilizzato per un primo rudimentale controllo sulla sintassi.
int endofquery; // Usato per il check sulla fine della query
/*                        Restricted Values Elements Index                   */

typedef struct RestrictedValElList {									
	xmlNode *reffered;
	struct RestrictedValElList *next;
	} RestrictedValElList;

#ifdef _WIN32
static RestrictedValElList *actCat[4] = {NULL, NULL, NULL, NULL },
					*addCat[15] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*impSev[4] = {NULL, NULL, NULL, NULL },
					*impCom[2] = {NULL, NULL },
					*impTyp[6] = {NULL, NULL, NULL, NULL, NULL, NULL },
					*filCat[2] = {NULL, NULL },
					*filPer[9] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*idType[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*linCat[6] = {NULL, NULL, NULL, NULL, NULL, NULL },
					*cheAlg[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*nodCat[13] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*refOri[6] = {NULL, NULL, NULL, NULL, NULL, NULL },
					*conRat[4] = {NULL, NULL, NULL, NULL },
					*useCat[3] = {NULL, NULL, NULL };

static const char *action_category[4]= {"block-installed","notification-sent","taken-offline","other"};
static const char *address_category[15]= {"unknown","atm","e-mail","lotus-notes","mac","sna","vm","ipv4-addr","ipv4-addr-hex","ipv4-net","ipv4-net-mask","ipv6-addr","ipv6-addr-hex","ipv6-net","ipv6-net-mask"};
static const char *impact_severity[4]= {"info","low","medium","high"};
static const char *impact_completion[2]= {"failed","succeeded"};
static const char *impact_type[6]= {"admin","dos","file","recon","user","other"};
static const char *file_category[2]= {"current","original"};
static const char *file_permission[9]= {"noAccess","read","write","execute","search","delete","executeAs","changePermissions","takeOwnership"};
static const char *id_type[7]= {"current-user","original-user","target-user","user-privs","current-group","group-privs","other-privs"};
static const char *linkage_category[6]= {"hard-link","mount-point","reparse-point","shortcut","stream","symbolic-link"};
static const char *checksum_algorithm[10]= {"MD4","MD5","SHA1","SHA2-256","SHA2-384","SHA2-512","CRC-32","Haval","Tiger","Gost"};
static const char *node_category[13]= {"unknown","ads","afs","coda","dfs","dns","hosts","kerberos","nds","nis","nisplus","nt","wfw"};
static const char *reference_origin[6]= {"unknown","vendor-specific","user-specific","bugtraqid","cve","osvdb"};
static const char *confidence_rating[4]= {"low","medium","high","numeric"};
static const char *user_category[3]= {"unknown","application","os-device"};

#else
RestrictedValElList *actCat[4] = {NULL, NULL, NULL, NULL },
					*addCat[15] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*impSev[4] = {NULL, NULL, NULL, NULL },
					*impCom[2] = {NULL, NULL },
					*impTyp[6] = {NULL, NULL, NULL, NULL, NULL, NULL },
					*filCat[2] = {NULL, NULL },
					*filPer[9] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*idType[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*linCat[6] = {NULL, NULL, NULL, NULL, NULL, NULL },
					*cheAlg[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*nodCat[13] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
					*refOri[6] = {NULL, NULL, NULL, NULL, NULL, NULL },
					*conRat[4] = {NULL, NULL, NULL, NULL },
					*useCat[3] = {NULL, NULL, NULL };

const char *action_category[4]= {"block-installed","notification-sent","taken-offline","other"};
const char *address_category[15]= {"unknown","atm","e-mail","lotus-notes","mac","sna","vm","ipv4-addr","ipv4-addr-hex","ipv4-net","ipv4-net-mask","ipv6-addr","ipv6-addr-hex","ipv6-net","ipv6-net-mask"};
const char *impact_severity[4]= {"info","low","medium","high"};
const char *impact_completion[2]= {"failed","succeeded"};
const char *impact_type[6]= {"admin","dos","file","recon","user","other"};
const char *file_category[2]= {"current","original"};
const char *file_permission[9]= {"noAccess","read","write","execute","search","delete","executeAs","changePermissions","takeOwnership"};
const char *id_type[7]= {"current-user","original-user","target-user","user-privs","current-group","group-privs","other-privs"};
const char *linkage_category[6]= {"hard-link","mount-point","reparse-point","shortcut","stream","symbolic-link"};
const char *checksum_algorithm[10]= {"MD4","MD5","SHA1","SHA2-256","SHA2-384","SHA2-512","CRC-32","Haval","Tiger","Gost"};
const char *node_category[13]= {"unknown","ads","afs","coda","dfs","dns","hosts","kerberos","nds","nis","nisplus","nt","wfw"};
const char *reference_origin[6]= {"unknown","vendor-specific","user-specific","bugtraqid","cve","osvdb"};
const char *confidence_rating[4]= {"low","medium","high","numeric"};
const char *user_category[3]= {"unknown","application","os-device"};

#endif



/**\struct AlertList idmp.h
 * \brief Lista principale degli alert
 * 
 * Lista principale degli alert, tutti gli alert caricati sono inseriti in questa lista, ai cui nodi le strutture di indicizzazione fanno riferimento.
 */
typedef struct AlertList{
	xmlNode *root;///<Puntatore al nodo XML contenente l'alert
	unsigned char match[256];///<Array di tracciamento del matching sul singolo alert
	indexIpList *ip_index;///<Puntatore al nodo corripondente nell'indicie degli indirizzi ip
	dailyAlertList *time_index;///<Puntatore al nodo corrispondente nell'indice dei timestamp
	int *assessment_index;///<Puntatore al nodo corrispondente nell'indice degli assessment
	struct AlertList *next;///<Puntatore al nodo del prossimo alert
}AlertList;

AlertList *xpathNodeList;
/**\struct xmlNodeList
 * Lista di nodi xml contenenti gli alert importati dai file.
 */
typedef struct xmlNodeList {
	AlertList *item;///<L'albero XML contenente l'alert IDMEF
	struct xmlNodeList *next;///<Puntatore al prossimo elemento della lista
	} xmlNodeList;
/**\struct posList idmp.h
 * \brief Lista di nodi xml
 * 
 * Questa struttura rappresenta l'elemento di una lista linkata contenente, in ogni elemento, il puntatore alla lista degli alert xmlNodList.
 * Viene utilizzata dai filtri per elencare gli alert che hanno dato esito positivo alle condizioni richieste.
 */
typedef struct posList{
	xmlNodeList *list;///<Puntatore all'elemento della lista principale contenente l'alert
	int length;///<Lunghezza della lista
	struct posList *next;///<Puntatore al prossimo elemento della lista
}posList;
/**\struct executing_func idmp.h
 * \brief Lista dei puntatori alle funzioni di esecuzione dei filtri con le relative stringhe di identificazione
 * 
 * Questa struttura ha lo scopo di rendere semplice l'ampliamento dei filtri e delle relative strutture di
 * indicizzazione si vari elementi del formato IDMEF.<br>
 * La struttura, di per sè molte semplice in quanto contiene una stringa identificativa dell'operazione e i puntatori
 * alle relative funzioni di esecuzione e di parsing, permette di aggiungere a piacimento, nella fase di init, filtri
 * sui vari campi IDMEF, semplicemente creando la funzione di ricerca e un nodo nella lista di executing_func nel
 * quale compaiano l'identificativo del filtro appena creato, il puntatore alla funzione di esecuzione e quello alla
 * funzione di parsing.
 */
typedef struct executing_func{
	char *op;
	xmlNodeList *(*ex)(processingTree *this,stringList *sel,VortexConnection *cn,VortexChannel *ch);
	int (*parse)(processingTree *this,char *where,int index,int i);
	void (*del)(AlertList *to_delete);
	struct executing_func *next;
}executing_func;

executing_func *ef;///<Radice della lista di funzioni di esecuzione




#endif
